home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / package_16-january-2001.zip / Effects / Q rebond.cpp < prev    next >
C/C++ Source or Header  |  2000-12-09  |  3KB  |  195 lines

  1.  
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <assert.h>
  5. #include <math.h>
  6. #include "C:\progra~1\zik\buzz\dev\MachineInterface.h"
  7.  
  8. double const Silence = log(1.0 / 32768);
  9.  
  10.  
  11. CMachineParameter const paraDeltaT = 
  12.     pt_word,                                        // type
  13.     "Delta T",
  14.     "Temps du premier rebond",                        // description
  15.     1,                                                // MinValue    
  16.     0xfffe,                                            // MaxValue
  17.     0xffff,                                            // NoValue
  18.     MPF_STATE,                                        // Flags
  19.     0x1000,
  20. };
  21.  
  22. CMachineParameter const paraAttenuation = 
  23.     pt_byte,                                        // type
  24.     "Attenuation",
  25.     "Attenuation a chaque rebond",                            // description
  26.     0,                                                // MinValue    
  27.     0xc0,                                            // MaxValue
  28.     0xff,                                            // NoValue
  29.     MPF_STATE,                                        // Flags
  30.     0x80
  31. };
  32.  
  33.  
  34. CMachineParameter const *pParameters[] = 
  35.     // global
  36.     ¶DeltaT,
  37.     ¶Attenuation,
  38.     
  39. };
  40.  
  41. #pragma pack(1)        
  42.  
  43. class gvals
  44. {
  45. public:
  46.     word deltaT;
  47.     byte attenuation;
  48. };
  49.  
  50. #pragma pack()
  51.  
  52. CMachineInfo const MacInfo = 
  53. {
  54.     MT_EFFECT,                                // type
  55.     MI_VERSION,    
  56.     0,                                        // flags
  57.     0,                                        // min tracks
  58.     0,                                        // max tracks
  59.     2,                                        // numGlobalParameters
  60.     0,                                        // numTrackParameters
  61.     pParameters,
  62.     0,
  63.     NULL,
  64. #ifdef _DEBUG
  65.     "Q-Rebond (Debug build)",        // name
  66. #else
  67.     "Q-Rebond",                    // name
  68. #endif
  69.     "Rebond",                                    // short name
  70.     "Q",                        // author
  71.     NULL
  72. };
  73.  
  74.  
  75. class mi : public CMachineInterface
  76. {
  77. public:
  78.     mi();
  79.     virtual ~mi();
  80.  
  81.     virtual void Init(CMachineDataInput * const pi);
  82.     virtual void Tick();
  83.     virtual bool Work(float *psamples, int numsamples, int const mode);
  84.     virtual char const *DescribeValue(int const param, int const value);
  85.  
  86. private:
  87.     int Attenuation;
  88.     int DeltaT;
  89.     
  90.     gvals gval;
  91.     float *buffer;
  92.     int buffcount;
  93.     
  94. };
  95.  
  96. DLL_EXPORTS
  97.  
  98. mi::mi()
  99. {
  100.     GlobalVals = &gval;
  101. }
  102.  
  103. mi::~mi()
  104. {
  105. delete (buffer);
  106. }
  107.  
  108. void mi::Init(CMachineDataInput * const pi)
  109. {
  110.     DeltaT = (int) (0x1000 * 44100 *2.0 /0xFFFE);
  111.     Attenuation = 0x80;
  112.     buffcount=0;
  113.     buffer = new float[ 8*44100];
  114.     memset (buffer,0,8*44100);
  115.  
  116. void mi::Tick()
  117. {
  118.     
  119.     if (gval.attenuation != paraAttenuation.NoValue)
  120.         Attenuation = gval.attenuation;
  121.         
  122.  
  123.     if (gval.deltaT != paraDeltaT.NoValue)
  124.         DeltaT = (int) (gval.deltaT * 2.0 / 0xFFFE *44100);
  125.         
  126. }
  127.  
  128. char const *mi::DescribeValue(int const param, int const value)
  129. {
  130.     static char txt[16];
  131.  
  132.     switch(param)
  133.     {
  134.     case 0:
  135.         sprintf(txt, "%.1f ticks", (float)DeltaT / pMasterInfo->SamplesPerTick);
  136.         break;
  137.     case 1:        
  138.         sprintf(txt, "%.1f%%", Attenuation * 100.0 / 256);
  139.         break;        
  140.     default:
  141.         return NULL;
  142.     }
  143.  
  144.     return txt;
  145. }
  146.  
  147. bool mi::Work(float *psamples, int numsamples, int const mode)
  148. {
  149.     
  150.     
  151.     if (mode == WM_NOIO)
  152.         return false;
  153.     
  154.  
  155.  
  156.     do 
  157.     {
  158.         int j;
  159.         float s=0;
  160.  
  161.         if (mode & WM_READ)
  162.             s=buffer[buffcount]=*psamples;
  163.         else
  164.             buffer[buffcount]=0;
  165.         if (--buffcount<0) buffcount = 8*44100-1;
  166.         if (mode & WM_WRITE)
  167.         {
  168.             int j0=DeltaT;
  169.             float p=1;
  170.  
  171.             j=0;
  172.             do
  173.             {
  174.                 p=p*(float)(Attenuation / 256.0);
  175.                 j = DeltaT+Attenuation*j/256;
  176.                 s+=buffer[(buffcount+j+1) % (8*44100)]* p;
  177.             } while (p*DeltaT > 1 && p>Silence);
  178.             *psamples=s;
  179.         }
  180.         psamples++;
  181.  
  182.     } while(--numsamples);
  183.  
  184.     
  185.     if (mode & WM_WRITE)
  186.         return true;
  187.     else    return false;
  188. }
  189.  
  190.  
  191.